package br.urca.controller;

import javax.inject.Inject;

import org.apache.commons.mail.EmailException;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Result;
import br.urca.dao.AlunoDAO;
import br.urca.dao.AlunosCursoDAO;
import br.urca.interceptor.InterceptResource;
import br.urca.interceptor.NoInterceptMethod;
import br.urca.model.AlunoCurso;
import br.urca.util.AOEmail;
import br.urca.util.ValidacaoDados;

@InterceptResource
@Controller
public class RecuperarSenhaController {
	
	private Result result;
	private AlunosCursoDAO mAlunosCursoDAO;
	private AlunoDAO mAlunoDAO;
	
	@Deprecated public RecuperarSenhaController() { }

	@Inject
	public RecuperarSenhaController(Result result,
			AlunosCursoDAO mAlunosCursoDAO, AlunoDAO mAlunoDAO) {
		super();
		this.result = result;
		this.mAlunosCursoDAO = mAlunosCursoDAO;
		this.mAlunoDAO = mAlunoDAO;
	}

	@NoInterceptMethod
	@Path("/lembrarminhasenha")
	public void index() {

	}
	
	@NoInterceptMethod
	public void buscar(String matricula, String cpf, String email, String confirmacao) {
		try {
			if (matricula != null && cpf != null) {
				
				String mMatricula = ValidacaoDados.removerMascara(matricula);
				String mCPF = ValidacaoDados.removerMascara(cpf);
				
				if (ValidacaoDados.loginValido(mMatricula) && ValidacaoDados.caracterCPFValido(mCPF)) {
					AlunoCurso alunoCurso = mAlunosCursoDAO.buscaPorMatricula(mMatricula);
					if (alunoCurso != null) {
						if (mCPF.equalsIgnoreCase(alunoCurso.getAluno().getCpf())) {
							
							if ((alunoCurso.getAluno().getEmail() == null) && (email == null)) {
								this.result.include("matricula", matricula)
								.include("mensagem","Não encontramos nenhum email cadastrado para você. Por favor informe o seu email no campo abaixo.")
										.include("cpf", cpf)
										.include("email", email)
										.include("mostraEmail", true)
										.redirectTo(this).index();
								
							} else if ((alunoCurso.getAluno().getEmail() == null) && (email != null)) {
								
								if (ValidacaoDados.validarEmail(email)) {
									if (confirmacao != null) {
										if (email.equalsIgnoreCase(confirmacao)) {
											alunoCurso.getAluno().setEmail(email);
											
											mAlunoDAO.salvar(alunoCurso.getAluno());
											
											enviarEmail(alunoCurso.getAluno().getEmail(), alunoCurso.getSenha(), alunoCurso.getAluno().getNome());
										} else {
											this.result.include("mostraEmail", true);
											throw new Exception("E-mails não são iguais. Por favor verifique se você digitou algo errado.");
										}
									} else {
										this.result.include("mostraEmail", true);
										throw new Exception("É necessário preecher o e-mail de confirmação!");
									}
								} else {
									this.result.include("mostraEmail", true);
									throw new Exception("Email inválido! Por favor verifique.");
								}
								
							} else if (alunoCurso.getAluno().getEmail() != null) {
								enviarEmail(alunoCurso.getAluno().getEmail(), alunoCurso.getSenha(), alunoCurso.getAluno().getNome());
							}
						} else {
							throw new Exception("Dados inválidos. Por favor verifique se há algum número errado.");
						}
					} else {
						throw new Exception("Dados inválidos. Por favor verifique se há algum número errado.");
					}
				} else {	
					throw new Exception("Dados com caracteres inválidos. Por favor verifique se há algum número errado.");
				}
			} else {
				throw new Exception("Campo de matrícula ou CPF não preenchidos!");				
			}
		} catch(Exception e) {
			this.result.include("mensagem", e.getMessage())
					.include("matricula", matricula).include("cpf", cpf)
					.include("confirmacao", confirmacao)
					.include("email", email).redirectTo(this).index();
		}
	}
	
	private void enviarEmail(String email, String senha, String nomeAluno) {
		try {
			String mensagem = null;
			mensagem = "Caro(a) "+ nomeAluno + ", <br />"
					+ "conforme solicitado pelo(a) Sr.(a) segue a sua senha de acesso ao aluno online e matrícula online: <br /><br />" 
					+ "<b>Senha:</b> "+senha+"<br />";
			AOEmail.enviarHtmlEmail(email, "Recuperação de Senha - URCA", mensagem);
			this.result.include("msgenvio", "Email enviado com sucesso para o endereço "+email+", verifique a caixa de entrada do seu email.")
					.redirectTo(this).index();
		} catch (EmailException e) {
			e.printStackTrace();
		}
	}
	
	
}
